package com.peter.design.pattern.chain.auth.builderchain;

import com.peter.design.pattern.chain.auth.Member;

/**
 * @Auther: 肖冬
 * @Date: 2020/7/31 00:59
 * @Description:
 */
public abstract class Handler<T> {
    protected Handler next;
    public void next(Handler next){
        this.next = next;
    }

    public abstract void doHandler(Member member);

    public static class Builder<T>{
        private Handler<T> head;
        private Handler<T> tail;


        /**
         * 第一次：head和tail指向同一个对象
         * 第二次：tail设置下一个节点，也就是head设置了下一个节点。同时，tail指向当前节点。
         * 此时，tail和head的尾节点指向同一个对象
         * 第三次：tail设置next节点，就是head的设置了下一个节点，。同时，tail指向当前节点。
         * 此时，tail和head的尾节点指向同一个对象
         * 总结：tail就是不断为head续节点的。因为一开始head和tail指向同一个对象
         * 这是一个单链
         */
        public Builder<T> addHandler(Handler handler){
//            do {
                if(this.head == null){
                    this.head = this.tail = handler;
                    return this;
                }
                this.tail.next(handler);
                this.tail = handler;
//            }while (false);//真正框架中，如果是双向链表，会判断是否已经到了尾部
            return this;
        }

        public Handler<T> build(){return this.head;}
    }
}
